package com.unitechs.trap.common.pojo.trap.entity;


import com.unitechs.trap.common.pojo.config.ExConfiguration;
import lombok.Data;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;

import java.io.Serializable;
import java.util.Optional;


@Data
public class AllData implements Serializable {
    /**
     * OID
     */
    private String trapOid;
    /**
     * {厂家名称}_{trap英文名}   #厂家名称采用dc_res_vendor.vendorname
     */
    private String trapTypeCode;

    /**
     * 告警标题
     * {厂家名称}_{trap英文名}   #厂家名称采用dc_res_vendor.vendorname
     */
    private String trapTypeDesc;

    /**
     * 网管告警级别
     */
    private Integer alarmlevel;

    private String alarmlevelString;


    /**
     * 唯一标识码
     * {厂家名称}_{trap英文名}   #厂家名称采用dc_res_vendor.vendorname
     */
    private String alarmtypeCode;


    /**
     * 告警描述
     */
    private String alarmtypeDescr;

    /**
     * 告警类型
     */
    private String alarmclassCode;

    /**
     * 用于判断恢复还是告警
     */
    private Integer allIndex;
    /**
     * 用于拼接
     */
    private String trapTypeCodeId;

    private String upDown;


    /**
     * 获取单元格的值（可能为空）
     *
     * @param row       行
     * @param cellIndex 单元格的索引
     * @return 单元格的值（Optional类型）
     */
    private Optional<String> getCellValue(HSSFRow row, int cellIndex) {
        // 使用Optional避免空指针异常
        return Optional.ofNullable(row)
                .map(r -> r.getCell(cellIndex))
                .filter(c -> !c.toString().isEmpty())
                .map(Object::toString);
    }

    /**
     * 设置Trap OID
     *
     * @param lastData 上一个数据
     * @param sheet    工作表
     * @param row      行数
     * @param version  版本号
     */
    public void setTrapOid(AllData lastData, HSSFSheet sheet, int row, String version) {
        // 获取Trap OID所在的单元格
        int trapOidCell = ExConfiguration.getExConfigurationMap(version).get(version + "_TRAP_OID_CELL");
        // 获取单元格的值，如果单元格为空则使用上一个数据的Trap OID

        String cellValue = getCellValue(sheet.getRow(row), trapOidCell).orElse(lastData.getTrapOid());

        this.trapOid = cellValue;
    }


    /**
     * 设置Trap类型代码
     *
     * @param lastData 上一个数据
     * @param sheet    工作表
     * @param row      行数
     * @param coName   公司名称
     * @param version  版本号
     */
    public void setTrapTypeCode(AllData lastData, HSSFSheet sheet, int row, String coName, String version) {
        // 获取Trap类型代码所在的单元格
        int trapTitleCell = ExConfiguration.getExConfigurationMap(version).get(version + "_TRAP_TITLE_CELL");
        // 获取单元格的值，如果单元格为空则使用上一个数据的Trap类型代码
        String cellValue = getCellValue(sheet.getRow(row), trapTitleCell).orElse(lastData.getTrapTypeCode());
        if (!cellValue.isEmpty()) {
            // 如果单元格不为空，则使用公司名称和单元格的值设置Trap类型代码
            this.trapTypeCode = cellValue;
        }
    }

    public void setTrapTypeCode(AllData lastData, HSSFSheet sheet, int row, String version) {
        // 获取Trap类型代码所在的单元格
        int trapTitleCell = ExConfiguration.getExConfigurationMap(version).get(version + "_TRAP_TITLE_CELL");
        // 获取单元格的值，如果单元格为空则使用上一个数据的Trap类型代码
        String cellValue = getCellValue(sheet.getRow(row), trapTitleCell).orElse(lastData.getTrapTypeCode());
        if (!cellValue.isEmpty()) {
            // 如果单元格不为空，则使用公司名称和单元格的值设置Trap类型代码
            this.trapTypeCode = cellValue;
        }
    }

    /**
     * 设置Trap类型描述
     *
     * @param allData     当前数据
     * @param lastData    上一个数据
     * @param sheet       工作表
     * @param row         行数
     * @param coChinaName 公司中文名称
     * @param version     版本号
     */
    public void setTrapTypeDesc(AllData allData, AllData lastData, HSSFSheet sheet, int row, String coChinaName, String version) {
        // 获取Trap类型描述所在的单元格
        int trapNameCell = ExConfiguration.getExConfigurationMap(version).get(version + "_TRAP_NAME_CELL");
        // 获取单元格的值，如果单元格为空且Trap OID与上一个数据不同，则不设置Trap类型描述
        String cellValue = getCellValue(sheet.getRow(row), trapNameCell).orElse("");
        if (cellValue.isEmpty() && !lastData.getTrapOid().equals(allData.getTrapOid())) {
            this.trapTypeDesc = null;
        } else {
            // 如果单元格不为空，则使用公司中文名称和单元格的值设置Trap类型描述
            this.trapTypeDesc =  cellValue;
        }
    }

    public void setTrapTypeDesc(AllData allData, AllData lastData, HSSFSheet sheet, int row, String version) {
        // 获取Trap类型描述所在的单元格
        int trapNameCell = ExConfiguration.getExConfigurationMap(version).get(version + "_TRAP_NAME_CELL");
        // 获取单元格的值，如果单元格为空且Trap OID与上一个数据不同，则不设置Trap类型描述
        String cellValue = getCellValue(sheet.getRow(row), trapNameCell).orElse("");
        if (cellValue.isEmpty() && !lastData.getTrapOid().equals(allData.getTrapOid())) {
            this.trapTypeDesc = null;
        } else {
            // 如果单元格不为空，则使用公司中文名称和单元格的值设置Trap类型描述
            this.trapTypeDesc = cellValue;
        }
    }


    /**
     * 设置告警级别
     *
     * @param lastData 上一次数据
     * @param sheet    表格
     * @param row      行
     * @param version  版本
     */
    public void setAlarmlevel(AllData lastData, HSSFSheet sheet, int row, String version) {
        int trapOidCell = ExConfiguration.getExConfigurationMap(version).get(version + "_TRAP_LEVEL_CELL");
        if (sheet.getRow(row).getCell(trapOidCell) == null || sheet.getRow(row).getCell(trapOidCell).toString().equals("")) {
            this.alarmlevel = lastData.getAlarmlevel();
        } else {
            switch (sheet.getRow(row).getCell(trapOidCell).toString()) {
                case "一级告警":
                    this.alarmlevel = 5;
                    break;
                case "二级告警":
                    this.alarmlevel = 4;
                    break;
                case "三级告警":
                    this.alarmlevel = 3;
                    break;
                case "四级告警":
                    this.alarmlevel = 2;
                    break;
                case "五级告警":
                    this.alarmlevel = 1;
            }
        }
    }

    public void setAlarmlevelString(AllData lastData, HSSFSheet sheet, int row, String version) {
        int trapOidCell = ExConfiguration.getExConfigurationMap(version).get(version + "_TRAP_LEVEL_CELL");
        if (sheet.getRow(row).getCell(trapOidCell) == null || sheet.getRow(row).getCell(trapOidCell).toString().equals("")) {
            this.alarmlevelString = lastData.getAlarmlevelString();
        } else {
            this.alarmlevelString = sheet.getRow(row).getCell(trapOidCell).toString();

        }
    }


    /**
     * 设置告警类别编码
     *
     * @param lastData 上一条数据
     * @param sheet    表格
     * @param row      行索引
     * @param version  版本号
     */
    public void setAlarmclassCode(AllData lastData, HSSFSheet sheet, int row, String version) {
        // 获取告警类别单元格的索引
        int trapOidCell = ExConfiguration.getExConfigurationMap(version).get(version + "_TRAP_TYPE_CELL");
        // 判断告警类别单元格中的值是否为空
        if (sheet.getRow(row).getCell(trapOidCell) == null || sheet.getRow(row).getCell(trapOidCell).toString().equals("")) {
            // 如果为空，将告警类别编码设为上一条数据的告警类别编码
            this.alarmclassCode = lastData.getAlarmclassCode();
        } else {
            // 如果不为空，根据单元格中的值判断告警类别编码为"DP"还是"DS"
            if (sheet.getRow(row).getCell(trapOidCell).toString().contains("性能")) {
                // 如果单元格中包含“性能”，则告警类别编码为"DP"
                this.alarmclassCode = "DP";
            } else {
                // 否则告警类别编码为"DS"
                this.alarmclassCode = "DS";
            }
        }
    }

    public void setAlarmclassCodeString(AllData lastData, HSSFSheet sheet, int row, String version) {
        // 获取告警类别单元格的索引
        int trapOidCell = ExConfiguration.getExConfigurationMap(version).get(version + "_TRAP_TYPE_CELL");
        // 判断告警类别单元格中的值是否为空
        if (sheet.getRow(row).getCell(trapOidCell) == null || sheet.getRow(row).getCell(trapOidCell).toString().equals("")) {
            // 如果为空，将告警类别编码设为上一条数据的告警类别编码
            this.alarmclassCode = lastData.getAlarmclassCode();
        } else {

            this.alarmclassCode = sheet.getRow(row).getCell(trapOidCell).toString();

        }
    }


    /**
     * 设置trap类型代码ID
     *
     * @param lastData 上一个数据
     * @param sheet    工作表
     * @param row      行数
     * @param version  版本号
     */
    public void setTrapTypeCodeId(AllData lastData, HSSFSheet sheet, int row, String version) {
        int trapOidCell = ExConfiguration.getExConfigurationMap(version).get(version + "_TRAP_NMS_ID_CELL");
        String cellValue = getCellValue(sheet.getRow(row), trapOidCell).orElse("");
        this.trapTypeCodeId = cellValue.isEmpty() ? lastData.getTrapTypeCodeId() : cellValue;
    }


    /**
     * 设置告警类型描述
     *
     * @param lastData 上一个数据
     * @param sheet    工作表
     * @param row      行数
     * @param coName   公司名称
     * @param version  版本号
     */
    public void setAlarmtypeDescr(AllData lastData, HSSFSheet sheet, int row, String coName, String version) {
        int trapOidCell = ExConfiguration.getExConfigurationMap(version).get(version + "_TRAP_NAME_CELL");
        String cellValue = getCellValue(sheet.getRow(row), trapOidCell).orElse("");
        this.alarmtypeDescr = cellValue.isEmpty() ? lastData.getTrapTypeCode() : cellValue;
    }


}
